﻿<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
<title>新闻</title> 
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<style type="text/css">
<!--
.title {
	font-size: 16px;
	text-align: center;
	clear: both;
	float: left;
	padding-top: 20px;
	padding-bottom: 20px;
	width: 100%;
	background-color: #6699CC;
}
.content {
	width: 700px;
	text-align: left;
	margin-top: 10px;
	margin-right: auto;
	margin-bottom: 10px;
	margin-left: auto;
}
-->
</style>
</head> 

<body>
<div>
	<div class="title">新闻抓取</div>
	<div style="clear:both"><hr /></div>
	<div class="content">
<?php

	/***************************
	 @name zf
	 @time 2014-02-19
	 @parameter url：网址
	 @func  获取新闻标题、时间、新闻url
	***************************/
	function Getnews($url){
		 //$url = "http://tech.ifeng.com/roll/rtlist_20140218/1.shtml";//网址
		//print_r(Get_news($url,$count));
		$handle=fopen($url,"r");
					
					//fopen(filename,mode,include_path,context) 
					//filename表示一个本地文件或者url r表示以只读方式读取file 指针指向文件头 返回值类型为指针 错误返回false
		
		$newsarr=array();
		
					//排除非新闻类的标签
		while(!feof($handle)){
					
					//feof 表示是否读取完毕handle 读取完返回true 超时或者未读完返回false 检查到eof为读完
					//feof(handle)
		
		$line=fgets($handle);
					
					//fgets从文件指针处读取出一行，默认值为1k
					//fgets(handle,length)
			
			$count=0;
			str_replace("<h4>","",$line,$count);//匹配新闻中的标签，进行排除
						
						//str_replace(find,replace,string,count)
						//通过查<h4>来用replace替换掉string中的相应的字符，每替换一次count加1，count用来计数
			if($count>0){
				$newarr[]=$line;
			}
		}
		//print_r($newarr);
		fclose($handle);
		$c=0;
		$res=array();
								//用正则匹配函数
		foreach($newarr as $k=>$v){
		
								//foreach($array as $k=>$v)	
								//表示的是对array进行遍历，在遍历的过程中呢，将键值赋给k，将元素值赋给v
						
			$ptr="/<li><h4>(.*)<\/h4><a href=\"(.*)\" target=\"_blank\">(.*)<\/a>/";
			
								//抓取正则表达式
			
			preg_match_all($ptr,$v,$str,PREG_SET_ORDER);//抓取匹配新闻
			
							//preg_match_all(pattern,subject,matches,flags,offset)
							//搜索subject中所有匹配pattern给定的正则表达式的匹配结果并将其以flag制定顺序输出到matches中
							//matches为多维数组
							//PREG_SET_ORDER表示matches[0]为第一次匹配到的所有匹配（包括子组） matche[1]表示第二次匹配得到的所有匹配
												
			if(isset($str)){     //对新闻进行重新赋值数组
				$res[$c]=array();
				$res[$c][]=$str[0][1];
				$res[$c][]=$str[0][2];
				$res[$c][]=$str[0][3];
				$c=$c+1;
			}
		}
		return $res;
	}
		/***************************
	 @name zf
	 @time 2014-02-19
	 @parameter url：网址
	 @func  获取新闻标题、时间、新闻url
	 *********************************/
	function GetSource($url)
	{
		$recarr=array();
		$handle=fopen($url,'r');
		
			while(!feof($handle))
			{
				$line=fgets($handle);	
				$count=0;
				str_replace('ss02',"",$line,$count);
				if($count>0)
				{
					$recarr[]=$line;
				}
			}	
			$rot = array();
			$rot[]=array();
			$ptr = "/<a href=\"(.*)\" itemprop=\"isBasedOnUrl\" target=\"_blank\" ref=\"nofollow\">(.*)<\/a>/";
			preg_match_all($ptr,implode($recarr),$str,PREG_SET_ORDER);
			if(isset($str))
			{
			     //print_r($str);
				 if($str[0][1])
				 {
				$rot[0][0]=$str[0][1];
				$rot[0][1]=$str[0][2];
				}
				else
				{
					$rot[0][1]="凤凰数码";
					$rot[0][0]=$url;
				}				
			}
			//print_r($rot);
				return $rot;
	}
	/***************************
	 @name zf
	 @time 2014-02-19
	 @parameter page:显示页数 totalnum:数据总量 numPerPage:每页显示数量
	 @func  翻页功能
	***************************/
	function  pagefunc($page,$totalnum,$numPerPage){
        //得到分页导航
	    $pagestr='';
		//如果不是第一页，则有首页导航
		if($page>1){
			$pagestr .= '<a href="index.php?page=1 id="firstpage">首  页</a>&nbsp;&nbsp;';
		}else{
			$pagestr .= '首  页&nbsp;&nbsp;';
		}
		if ( $page == 1 ) {
			if ($totalnum > $numPerPage) {
				$pagestr .= '<a href="index.php?page='.($page+1).'">下一页</a>&nbsp;&nbsp;';
			}
		}else if ( $page == ceil( $totalnum/$numPerPage ) ) {
		
						//ceil(number) 函数向上取最接近的整数，返回为float
						
			$pagestr .= '<a href="index.php?page='.($page-1).'">上一页</a>&nbsp;&nbsp;';
		}else {
			$pagestr .= '<a href="index.php?page='.($page+1).'">下一页</a>&nbsp;&nbsp;<a href="index.php?page='.($page-1).'">上一页</a>&nbsp;&nbsp;';
		}
		//如果不是末页，则有末页导航
		if ( $page < ceil( $totalnum/$numPerPage ) ) {
			$pagestr .= '<a href="index.php?page='.ceil( $totalnum/$numPerPage ).'">末  页</a>';
		}else {
			$pagestr .= '末  页';
		}
		$pagestr .= '&nbsp;&nbsp;共&nbsp;'.$totalnum.'&nbsp;条记录';
		return $pagestr;
	}
	/***************************
	* 例子:抓取新闻
    ***************************/
    $url = "http://tech.ifeng.com/roll/rtlist_20140218/1.shtml";//网址
    //抓取新闻
	$j=0;
	$Source=array();
	
	$res=Getnews($url);
	
	while($j<10)
	{
		$Source[$j]=GetSource($res[$j][1]);
		$j++;
	}
	//print_r($Source);
	//得到分页导航
	//$pagestr='';
	$numPerPage=10;//每页显示数据条数
	$totalnum=count($res);//数据总条数
	$page=isset($_GET['page'])?$_GET['page']:1;//得到显示第几页
	$offset=($page-1)*$numPerPage;
    //获取翻页功能
	$pagestr=pagefunc($page,$totalnum,$numPerPage);

	echo '
		<table cellpadding="0" border="0" cellspacing="1" class="base_line" width="700">
		<tr style="font-weight:bold;text-align:center;">
			<td width="60">时间</td>
			<td width="200">新闻信息</td>
			<td width="80">操作</td>
			<td width="80">来源</td>
		</tr>';
	//逐条显示新闻信息
	for($i=$offset;$i<$numPerPage*$page;$i++){
	  //print_r($res[$i]);
       echo '<tr><td style="text-align:center">'.$res[$i][0].'</td>';
	   echo '<td>'.$res[$i][2].'</td>';
	   echo '<td><a href="'.$res[$i][1].'" target="_blank">查看</a>  <a href="#">删除</a>  <a href="#">编辑</a></td>';
	   echo '<td><a href="'.$Source[$i][0][0].'" target="_blank">       '.$Source[$i][0][1].'</a></td></tr>';
	}
	echo '<tr><td colspan="100%">'.$pagestr.'<td><tr>';
    echo '</table>';
?> 

</div>
<div style="clear:both"><hr /></div>
</div>
</body> 
</html> 
